www.gusucode.com > VC++ 解析emf文件结构并显示-源码程序 > VC++ 解析emf文件结构并显示-源码程序/code/EmfReader/UtilFunctions.cpp

    //Download by http://www.NewXing.com
#include "stdafx.h"
#include "EmfReaderDlg.h"

#define BFT_BITMAP	0x4d42   /* 'BM' */
#define BFT_SIZE	14		 /* Size */
CString CEmfReaderDlg::GetFileNameAndExt( CString strPathFileName ) 
{
	TCHAR achDrive[_MAX_DRIVE];
	TCHAR achDir[_MAX_DIR];
	TCHAR achFile[_MAX_FNAME];
	TCHAR achExt[_MAX_EXT];
	_tsplitpath_s(strPathFileName, achDrive, achDir, achFile, achExt);

	CString fileName = achFile ;
	fileName += achExt ;
	return fileName ;

}
void CEmfReaderDlg::WriteToBMPFile( CString strFileName , LONG id , PBITMAPINFO pBitmapInfo , LPBYTE lpDib  ) 
{
	CString szTempName ;
	szTempName.Format( L"e:\\temp\\emf\\%s_%d.bmp", GetFileNameAndExt(strFileName) , id );
	CFile file ;
	CFileException ex;
	if( ! file.Open( szTempName , CFile::modeReadWrite|CFile::modeCreate,&ex))
	{
		TCHAR szError[1024];
		ex.GetErrorMessage(szError, 1024);
		TRACE(L"Couldn't open source file::%s,errormsg:s\n",szTempName,szError) ;
		return ;
	}

	BITMAPFILEHEADER bm;
	bm.bfType = BFT_BITMAP;
	bm.bfSize = pBitmapInfo->bmiHeader.biSizeImage + pBitmapInfo->bmiHeader.biSize + pBitmapInfo->bmiHeader.biClrUsed * 4 + sizeof( BITMAPFILEHEADER ) ;
	bm.bfReserved1 = 0;
	bm.bfReserved2 = 0;
	bm.bfOffBits = pBitmapInfo->bmiHeader.biSize + sizeof( BITMAPFILEHEADER )  + pBitmapInfo->bmiHeader.biClrUsed * 4 ;
	try{
		file.Write( &bm , sizeof(BITMAPFILEHEADER) ) ;
		file.Write( pBitmapInfo , pBitmapInfo->bmiHeader.biSize +  pBitmapInfo->bmiHeader.biClrUsed * 4) ;
		file.Write( lpDib , pBitmapInfo->bmiHeader.biSizeImage) ;

	}catch(...)
	{
		TCHAR szError[1024];
		ex.GetErrorMessage(szError, 1024);
		TRACE(L"write file::%s,errormsg:s\n",szTempName,szError) ;
	}
	file.Close() ;
	return ;
	
}